Java Technologies Lazy Loading এবং Eager Loading এর ধারণা গাইড ও নোট

335

Hibernate হল একটি জনপ্রিয় Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশন এবং রিলেশনাল ডেটাবেসের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। Hibernate ডেটাবেস অপারেশনগুলোকে সহজ, পারফরম্যান্ট এবং কোডের পঠনযোগ্যতা উন্নত করার জন্য অনেক বৈশিষ্ট্য প্রদান করে, যার মধ্যে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল Lazy Loading এবং Eager Loading

এই দুইটি লোডিং স্ট্র্যাটেজি ডেটা লোড করার প্রক্রিয়াকে নির্ধারণ করে, এবং এগুলোর মাধ্যমে আপনি কতটা ডেটা প্রাথমিকভাবে লোড করবেন তা নিয়ন্ত্রণ করতে পারেন। Lazy Loading এবং Eager Loading এর মধ্যে পার্থক্য হল, Lazy Loading যখন প্রয়োজন তখন ডেটা লোড করে, আর Eager Loading ডেটা সম্পূর্ণ লোড করে যখন অবজেক্টটি তৈরি হয়।


1. Lazy Loading

Lazy Loading হল একটি লোডিং স্ট্র্যাটেজি যেখানে সম্পর্কিত ডেটা শুধুমাত্র তখন লোড করা হয় যখন সেটা প্রথমবারের মতো অ্যাক্সেস করা হয়। এটি ডেটার পরিমাণ কমানোর এবং অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করার জন্য ব্যবহৃত হয়, কারণ সমস্ত সম্পর্কিত ডেটা একসাথে লোড করার পরিবর্তে, শুধু প্রয়োজনীয় ডেটা লোড করা হয়।

Lazy Loading-এর সুবিধা:

  • Performance: ডেটাবেসের সাথে অনধিকার ডেটা লোড না করার কারণে এটি অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করতে সাহায্য করে।
  • Reduced Memory Usage: শুধুমাত্র প্রয়োজনীয় ডেটাই লোড হয়, তাই মেমরি খরচ কম হয়।

Lazy Loading-এর অসুবিধা:

  • N+1 Query Problem: যখন একাধিক সম্পর্কিত অবজেক্ট লোড করা হয়, তখন এটি অতিরিক্ত SQL কুয়েরি তৈরি করতে পারে, যাকে N+1 query problem বলা হয়। যেমন, একটি parent অবজেক্টের জন্য সব child অবজেক্ট লোড করার সময়, একাধিক কুয়েরি তৈরি হতে পারে, যা পারফরম্যান্স কমাতে পারে।
  • LazyInitializationException: যদি আপনি ডেটা অ্যাক্সেস করার আগে session বন্ধ করে দেন, তবে একটি LazyInitializationException উঠতে পারে।

Lazy Loading উদাহরণ:

ধরা যাক আপনার Employee এবং Address নামক দুটি ক্লাস রয়েছে, এবং আপনি Employee-এর সাথে Address সম্পর্ক লোড করতে চান। যদি Lazy Loading ব্যবহার করা হয়, তবে Address সম্পর্ক তখনই লোড হবে, যখন আপনি এক্সেস করবেন।

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToOne(fetch = FetchType.LAZY)
    private Address address;
    
    // Getters, Setters, Constructors
}

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String street;
    private String city;
    
    // Getters, Setters, Constructors
}

এখানে, @OneToOne(fetch = FetchType.LAZY) ব্যবহার করা হয়েছে, যার মাধ্যমে Address অবজেক্টটি Lazy লোড করা হবে।


2. Eager Loading

Eager Loading হল একটি লোডিং স্ট্র্যাটেজি যেখানে সম্পর্কিত সমস্ত ডেটা একসাথে লোড করা হয়, যখন মূল অবজেক্টটি প্রথমবারের মতো লোড হয়। এটি ডেটার সাথে সম্পূর্ণ সম্পর্ক তৈরি করে এবং join করে সমস্ত সম্পর্কিত ডেটা লোড করে।

Eager Loading-এর সুবিধা:

  • No N+1 Problem: যেহেতু সমস্ত সম্পর্কিত ডেটা একবারে লোড করা হয়, তাই N+1 query problem হতে পারে না।
  • Simpler Queries: সম্পর্কিত সমস্ত ডেটা একসাথে লোড করা হয়, তাই কখনও কখনও কুয়েরি সরল হয় এবং কম কুয়েরি সংখ্যা থাকে।

Eager Loading-এর অসুবিধা:

  • Performance Issue: যদি আপনার সম্পর্কিত ডেটা অনেক বড় হয়, তবে Eager Loading সমস্ত ডেটা একসাথে লোড করার কারণে performance খারাপ হতে পারে, এবং এটি memory overhead বাড়াতে পারে।
  • Unnecessary Data Load: যদি কিছু ডেটা কখনও ব্যবহার না হয়, তবে সেগুলি লোড করার দরকার নেই এবং এটি wasted memory হতে পারে।

Eager Loading উদাহরণ:

ধরা যাক, আপনি একই Employee এবং Address ক্লাস ব্যবহার করছেন, এবং এখানে Eager Loading ব্যবহার করা হয়েছে:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToOne(fetch = FetchType.EAGER)
    private Address address;
    
    // Getters, Setters, Constructors
}

এখানে, @OneToOne(fetch = FetchType.EAGER) দ্বারা Address সম্পর্ক Eager Loading করা হয়েছে। অর্থাৎ, যখনই Employee লোড হবে, তখনই Address সম্পর্কও একসাথে লোড হবে।


Lazy vs Eager Loading: পার্থক্য

AspectLazy LoadingEager Loading
Data Loading Timeশুধুমাত্র যখন প্রয়োজন তখন ডেটা লোড করা হয়প্রথমে সব ডেটা একসাথে লোড করা হয়
Performanceপারফরম্যান্স উন্নত হতে পারে, কারণ শুধুমাত্র প্রয়োজনীয় ডেটা লোড হয়বড় ডেটাসেটের ক্ষেত্রে পারফরম্যান্স কম হতে পারে
Memory Usageমেমরি খরচ কম হতে পারে, কারণ শুধু প্রয়োজনীয় ডেটা লোড হয়বেশি মেমরি ব্যবহার হতে পারে, কারণ সব ডেটা একসাথে লোড হয়
Query Numberএকাধিক কুয়েরি তৈরি হতে পারে (N+1 সমস্যা)একক কুয়েরি তৈরি হয় (জয়েনের মাধ্যমে)
When to Useযখন আপনি বড় ডেটা নিয়ে কাজ করছেন এবং কিছু সম্পর্ক প্রয়োজন হতে পারেযখন সম্পর্কের সব ডেটা প্রয়োজন এবং আপনি তা একবারে লোড করতে চান

Lazy Initialization Exception

একটি সাধারণ সমস্যা যা Lazy Loading এর সময় ঘটতে পারে তা হল LazyInitializationException। এটি ঘটে যখন session বন্ধ হয়ে যায় এবং পরবর্তীতে আপনি একটি লেজি লোড করা সম্পর্ক অ্যাক্সেস করতে চেষ্টা করেন। Hibernate ট্রানজ্যাকশন চলাকালীন session বন্ধ হলে এই সমস্যা দেখা দেয়।

LazyInitializationException থেকে বাঁচার উপায়:

  1. Open Session in View Pattern: Spring-এ এই প্যাটার্ন ব্যবহার করা যেতে পারে যাতে session ভিউ রেন্ডার করার সময় খোলা থাকে।
  2. Initialize Data before Session Closes: session ক্লোজ করার আগে সম্পর্কিত ডেটা এক্সেস করে নিন।
  3. Use Eager Loading When Necessary: যদি আপনি জানেন যে সম্পর্কিত ডেটা সব সময় ব্যবহৃত হবে, তবে Eager Loading ব্যবহার করুন।

Hibernate-এ Lazy Loading এবং Eager Loading হল দুটি জনপ্রিয় ডেটা লোডিং স্ট্র্যাটেজি, যা ডেটাবেসের সম্পর্কিত ডেটা লোড করার পদ্ধতি নিয়ন্ত্রণ করে। Lazy Loading পারফরম্যান্স উন্নত করতে সাহায্য করে, কারণ এটি শুধুমাত্র প্রয়োজনীয় ডেটা লোড করে, কিন্তু এর ফলে N+1 Query Problem এবং LazyInitializationException হতে পারে। অপরদিকে, Eager Loading সব সম্পর্কিত ডেটা একসাথে লোড করে এবং N+1 Query Problem থেকে মুক্তি দেয়, তবে এটি performance overhead তৈরি করতে পারে, বিশেষত যখন ডেটা অনেক বড় হয়।

সঠিক লোডিং স্ট্র্যাটেজি নির্বাচন করার সময় অ্যাপ্লিকেশনের পারফরম্যান্স এবং ডেটাবেসের কার্যকারিতা সম্পর্কে ভালোভাবে চিন্তা করা উচিত।

Content added By
Promotion

Are you sure to start over?

Loading...